<?php
/**
 * Соединения с базой данных в системе.
 *
 * @author nrnwest@gmail.com
 *
 */
class Arm_Db
{
    /**
     * Реестер соединения с базаой(ми) данных.
     *
     * @var array
     */
    private static $_db = array();


    /**
     * Получения конекта с базой данных.
     *
     * @param array $params параметры для соединения с базой данных
     * @return Zend_Db_Adapter_Pdo_Mysql
     */
    public static function getAdapter($params=array())
    {
        if($params === array()) {
            // получаем данные для конекта по умолчанию
            $params = Arm_Core::getConfigApplication()->db->toArray();
            // получаем состояния работы системы
            if(Arm_Core::getEnvironment() !== 'staging') {
                // включаем профилирования
                $params['profiler'] = true;
            } else {
                $params['profiler'] = false;
            }
        }
        $keyConnect = self::_getKeyConnect($params);
        /**
         * Если есть ключ в реестре отдаем конект
         */
        if(array_key_exists($keyConnect, self::$_db)) {
            return self::$_db[$keyConnect];
        }

        // есил mysql сервер установим кодировку
        if(strtolower($params['adapter']) === 'pdo_mysql') {
            $params['driver_options'][PDO::MYSQL_ATTR_INIT_COMMAND] = "SET NAMES  " .
            $params['charset'];
        }elseif(strtolower($params['adapter']) === 'mysqli') {
            $params['driver_options'][MYSQLI_INIT_COMMAND] = "SET NAMES  " .
            $params['charset'];
        }

        self::$_db[$keyConnect] = Zend_Db::factory($params['adapter'], $params);
        return self::$_db[$keyConnect];
    }


    /**
     * Генерирует уникальный ключ для каждого конекта в системе с
     * базой данных.
     *
     * @param array $params параметры для соединения.
     * @return string
     */
    private static function _getKeyConnect(array $params)
    {
        $keyArray = array();
        $keyArray[] = strtolower($params['host']);
        $keyArray[] = strtolower($params['adapter']);
        $keyArray[] = strtolower($params['dbname']);
        return implode('-', $keyArray);
    }

    /**
     * Обнулит конект с всемя базами данных, или с одной если
     * указаны параметры для соединения с ней.
     *
     * @param array $params параметры для соединения.
     * @throw Arm_Db_Exception Если не существует соединения с базой данных.
     * @return void
     */
    public static  function clearConnect($params = array())
    {

        if($params === array()) {
            foreach (self::$_db as $k => $v) {
                /*@var $v Zend_Db_Adapter_Pdo_Mysql*/
                $v->closeConnection();
            }
            self::$_db = array();
        } else {
            $keyConnect =  self::_getKeyConnect($params);
            if(false === array_key_exists($keyConnect, self::$_db)) {
                throw new Arm_Db_Exception(Arm_Translate::_("Нет соединения с базой данны, с параметрами:" .
                print_r($params, true)));
            }
            self::$_db[$keyConnect]->closeConnection();
            unset(self::$_db[$keyConnect]);
            return;
        }
    }
    
    
    /**
     * Загрузка sql классов и возвращения их обьектов.
     * @param string $prefix пример Arm_Navigation_Sql
     * @param Zend_Db_Adapter_Abstract $db 
     */
public static function getSqlObject($prefix, Zend_Db_Adapter_Abstract $db = null)
    {
        if($db === null) {
       $db = Arm_Db::getAdapter();
   }
   $prefix = trim($prefix, '_') . '_';
   $config =  $db->getConfig();
   $adapter = $config['adapter'];
   $arrayAdapter = explode('_', $adapter);
   foreach ($arrayAdapter as $k=>$v) {
       $arrayAdapter[$k] = ucfirst(strtolower($v));
   }
   $class = $prefix  . implode('_',$arrayAdapter);
   if(false === Zend_Loader_Autoloader::getInstance()->autoload($class)) { 
       throw new Arm_Db_Exception(Arm_Translate::_('Не возможно загрузить класс "%s" Sql загрузчика', $class));
       exit;
   }
   // проверим что класс наследует родительский
   if(false === is_subclass_of($class, 'Arm_Db_Sql_Mysql')) {
       throw new Arm_Db_Exception(Arm_Translate::_('Класс "%s" должен наследовать Arm_Db_Sql_Mysql', $class));
       exit;
    }
    $sql = new $class($db);
    return $sql;
    }
    
    /**
     * Вернет общий тип сервера базы данных: mysql|oracle...
     * @param Zend_Db_Adapter_Abstract $db
     * @return string mysql|oracle...
     */
    public static function getTypeServer(Zend_Db_Adapter_Abstract $db = null)
    {
        if($db === null) {
       $db = Arm_Db::getAdapter();
       }
      $config =  $db->getConfig();
   $adapter = $config['adapter'];
   $arrayAdapter = explode('_', $adapter);

   if(count($arrayAdapter) === 2) {
       return strtolower($arrayAdapter[1]);
   }
   return strtolower($arrayAdapter[0]);
    }

}